#include <iostream>
#include <memory>
using namespace std;

class A{
public:
    A() = default;
    ~A(){ cout << __func__ << endl; }
};

void TEST1(){
    shared_ptr<A> p = make_shared<A>();
    shared_ptr<A> r(p);
    shared_ptr<A> q;

    cout << p.use_count() << endl;
    cout << q.use_count() << endl;
    cout << r.use_count() << endl << endl;

    // 设置p为空，则p的使用计数为0，q的使用计数为1
    // `p = q`会减少p指向对象的引用计数，次例中r的计数减少，增加q指向对象的引用计数
    q = make_shared<A>();
    p = q;

    cout << p.use_count() << endl;
    cout << q.use_count() << endl;
    cout << r.use_count() << endl << endl;

    // 设置p为空，则p的使用计数为0，q的使用计数为1
    p = nullptr;
    r = nullptr;   
    cout << p.use_count() << endl;
    cout << q.use_count() << endl;
    cout << r.use_count() << endl << endl;

    q = nullptr; // 再没有指针指向对象，自动销毁对象
    cout << p.use_count() << endl;
    cout << q.use_count() << endl;
    cout << r.use_count() << endl << endl;
}

int main(){
    TEST1();
    return 0;
}
